package com.liqi.web.service.device;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.liqi.common.core.domain.PageData;
import com.liqi.common.core.domain.PageParam;
import com.liqi.common.core.domain.R;
import com.liqi.dev.domain.DvPlugin;
import com.liqi.dev.domain.DvPluginVersion;
import com.liqi.dev.mapper.DvPluginMapper;
import com.liqi.dev.pojo.DvPluginMallReq;
import com.liqi.dev.pojo.DvPluginPageReq;
import com.liqi.dev.pojo.DvPluginUpgradeReq;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * @author tianye
 * @date 2023-04-03
 */
@Service
public class DvPluginService extends ServiceImpl<DvPluginMapper, DvPlugin> implements IService<DvPlugin> {

    @Autowired
    private DvPluginMapper dvPluginMapper;

    @Autowired
    private DvPluginVersionService dvPluginVersionService;

    // 分页
    public R<PageData<DvPlugin>> page(PageParam<DvPluginPageReq> pageParam) {
        DvPluginPageReq req = pageParam.getData();
        QueryWrapper<DvPlugin> qw = new QueryWrapper<>();
        if (req != null) {
            qw.like(StringUtils.isNotBlank(req.getPluginCode()), "plugin_code", req.getPluginCode());
            qw.like(StringUtils.isNotBlank(req.getPluginName()), "plugin_name", req.getPluginName());
        }
        qw.orderByDesc("plugin_id");
        PageHelper.startPage(pageParam.getPageNum(), pageParam.getPageSize(), pageParam.getOrderBy());
        List<DvPlugin> list = dvPluginMapper.selectList(qw);
        return R.ok(PageData.page(PageInfo.of(list)));
    }

    // 新增
    @Transactional
    public R add(DvPlugin dvPlugin) {
        dvPlugin.setPluginId(null);
        dvPlugin.setPluginCode(UUID.randomUUID().toString().replace("-", ""));
        dvPlugin.setCreateTime(new Date());
        dvPluginMapper.insert(dvPlugin);
        return R.ok();
    }

    // 修改
    @Transactional
    public R modify(DvPlugin dvPlugin) {
        int i = dvPluginMapper.updateById(dvPlugin);
        return i > 0 ? R.ok() : R.fail("修改失败");
    }

    // 删除
    @Transactional
    public R delete(Integer pluginId) {
        // 删除插件
        int i = dvPluginMapper.deleteById(pluginId);

        // 删除历史版本
        dvPluginVersionService.delete(pluginId);

        return i > 0 ? R.ok() : R.fail("删除失败");
    }

    // 版本升级
    @Transactional
    public R upgrade(DvPluginUpgradeReq dvPlugin) {
        DvPlugin dbPlugin = dvPluginMapper.selectById(dvPlugin.getPluginId());
        dvPluginVersionService.version(dbPlugin);

        dvPluginMapper.deleteById(dvPlugin.getPluginId());

        dbPlugin.setPluginId(null);
        dbPlugin.setPluginType(dvPlugin.getPluginType());
        dbPlugin.setVersion(dvPlugin.getVersion());
        dbPlugin.setIconUrl(dvPlugin.getIconUrl());
        dbPlugin.setFileUrl(dvPlugin.getFileUrl());
        dbPlugin.setRemark(dvPlugin.getRemark());
        dbPlugin.setUpdateContent(dvPlugin.getUpdateContent());
        dbPlugin.setCreateTime(new Date());
        dvPluginMapper.insert(dbPlugin);

        return R.ok();
    }

    // 版本列表
    public List<DvPluginVersion> versionList(String pluginCode) {
        return dvPluginVersionService.versionList(pluginCode);
    }

    // 我的插件
    public R<PageData<DvPlugin>> myPlugin(PageParam<List<Integer>> pageParam) {
        PageHelper.startPage(pageParam.getPageNum(), pageParam.getPageSize(), pageParam.getOrderBy());
        List<DvPlugin> list = dvPluginMapper.myPlugin(pageParam.getData());
        return R.ok(PageData.page(PageInfo.of(list)));
    }

    // 插件市场
    public R<PageData<DvPlugin>> mall(PageParam<DvPluginMallReq> pageParam) {
        PageHelper.startPage(pageParam.getPageNum(), pageParam.getPageSize(), pageParam.getOrderBy());
        List<DvPlugin> list = dvPluginMapper.mall(pageParam.getData());
        return R.ok(PageData.page(PageInfo.of(list)));
    }

}
